package cn.xkai.exercise.b;

import com.google.gson.Gson;

import java.security.SecureRandom;

/**
 * @description: 打乱数组
 * 给你一个整数数组 nums ，设计算法来打乱一个没有重复元素的数组。打乱后，数组的所有排列应该是 等可能 的。
 * @author: kaixiang
 * @date: 2022-07-13
 **/
public class Solution54 {
    /**
     * Solution(int[] nums) 使用整数数组 nums 初始化对象
     * int[] reset() 重设数组到它的初始状态并返回
     * int[] shuffle() 返回数组随机打乱后的结果
     */
    private int[] nums;
    private SecureRandom random;

    public Solution54(int[] nums) {
        this.nums = nums;
        random = new SecureRandom();
    }

    public int[] reset() {
        return nums;
    }

    public int[] shuffle() {
        if (nums == null) {
            return null;
        }
        int[] a = nums.clone();
        for (int j = 1; j < a.length; j++) {
            int i = random.nextInt(j + 1);
            swap(a, i, j);
        }
        return a;
    }

//    private void swap(int[] a, int i, int j) {
//        if (i != j) {
//            a[i] ^= a[j];
//            a[j] ^= a[i];
//            a[i] ^= a[j];
//        }
//    }

    private void swap(int[] a, int i, int j) {
        if (i != j) {
            a[i] = a[i] + a[j];
            a[j] = a[i] - a[j];
            a[i] = a[i] - a[j];
        }
    }

    public static void main(String[] args) {
        int[] strs = {1, 2, 3};
        Solution54 solution54 = new Solution54(strs);
        System.out.println(new Gson().toJson(solution54.shuffle()));
        System.out.println(new Gson().toJson(solution54.shuffle()));
        System.out.println(new Gson().toJson(solution54.shuffle()));
    }
}
